【CoffeeScript編】Node + Socket.IO で簡単なチャットアプリの作成
こんにちは、うえじゅんです。
今回は前回作成したチャットアプリを「CoffeeScript」で置き換えてみます。
CoffeeScriptについては「はじめるCoffeeScript」シリーズを見ていただけると嬉しいです。
CoffeeScriptのインストール
まず「CoffeeScript」インストールします。
ターミナルで以下のコマンドを実行してください。
(エラーが出る場合は、「sudo」をつけてみてください。)
「CoffeeScript」
npm install -g coffee-script
インストールが終わったらこちらもバージョンを確認しておきましょう。
「coffee -v」で「CoffeeScript version 1.4.0」と表示されたら成功です。
コンパイルをすることになるので、環境も作ってしまいましょう。
まずプロジェクトの配下に「coffee」フォルダを作成します。
さらに「coffee」フォルダの配下に「app.coffee」ファイルを作成します。
今回はファイルが少ないので必要ないかもしれませんが、「js」ファイルと「coffee」ファイルを同じ場所に置くとごちゃごちゃになりやすいので、「CoffeeScript」のファイルは別に配置すると管理するのが便利になります。
cmapp
├ app.js
├ coffee
│ ├ app.coffee
│ └ public
│ └ javascripts
│ └ chat.coffee
├ node_modules
├ package.json
├ ・・・
また今回コンパイル時に使うオプションは3つです。
-c コンパイルして「.js」ファイルにする
-b コンパイル時にトップレベルの関数ラッパーを含めないようにする
-o 引数に指定したディレクトリを保存先にする
以下は指定すると便利です。
-w ファイルを監視しての変更があった際に指定したコマンドを再実行する
coffee -cbo . coffee/
coffee -cbwo . coffee/
app.jsのcoffee化
「CoffeeScript」に変換するのであれば「js2coffee」を使えば一発ですが、最初のうちは学びも兼ねて地道に変換しましょう。
(js2coffeeについては「node.jsのいろいろなモジュール11 – js2coffee」を参照してください)
「app.js」
/** * Module dependencies. */ var express = require('express') , http = require('http') , path = require('path') , io = require('socket.io') var app = express() , server = require('http').createServer(app) , io = io.listen(server); app.configure(function(){ app.set('port', process.env.PORT || 3000); app.set('views', __dirname + '/views'); app.set('view engine', 'jade'); app.use(express.favicon()); app.use(express.logger('dev')); app.use(express.bodyParser()); app.use(express.methodOverride()); app.use(app.router); app.use(express.static(path.join(__dirname, 'public'))); }); app.configure('development', function(){ app.use(express.errorHandler()); }); server.listen(app.get('port')) io.sockets.on('connection', function(socket) { socket.on('message:send', function(data) { io.sockets.emit('message:receive', { message: data.message }); }); });
「app.coffee」
###* * Module dependencies. ### express = require 'express' http = require 'http' path = require 'path' io = require 'socket.io' app = express() server = http.createServer app io = io.listen server app.configure -> app.set 'port', process.env.PORT || 3000 app.set 'views', __dirname + '/views' app.set 'view engine', 'jade' app.use express.favicon() app.use express.logger 'dev' app.use express.bodyParser() app.use express.methodOverride() app.use app.router app.use express.static path.join __dirname, "public" app.configure 'development', -> app.use express.errorHandler() server.listen app.get 'port' io.sockets.on 'connection', (socket) -> socket.on 'message:send', (data) -> io.sockets.emit 'message:receive', { message: data.message }
そんなに複雑なことはしていないので、coffee化のメリットはあまりないかもしれませんが、それでもシンプルにはなったと思います。
chat.jsのcoffee化
「chat.js」
var socket = io.connect(); socket.on('message:receive', function (data) { $("div#chat-area").prepend("<div>" + data.message + "</div>"); }); function send() { var msg = $("input#message").val(); $("input#message").val(""); socket.emit('message:send', { message: msg }); }
「chat.coffee」
socket = io.connect() socket.on 'message:receive', (data) -> $("div#chat-area").prepend "<div>" + data.message + "</div>" send = -> msg = $("input#message").val() $("input#message").val "" socket.emit 'message:send', message: msg
こちらもそれ程メリットを感じれる規模感ではありませんね・・・
実行
実行前にコンパイルしましょう。
(wオプションで監視している方は不要です)
coffee -cbo . coffee/
では、実行してみましょう。
以下のコマンドで起動します。
node app
node app.js
「info - socket.io started」と表示されれば正常に起動しています。
起動したら「http://localhost:3000」にアクセスしましょう。
以下のような画面が表示されます。
入力して送信してみます。
他のブラウザでも開いているとそちらにも送信した内容が表示されます。
CoffeeScript化をしても同じように動きますね。